package top.FilterAndListener;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 *    ------------------------Filter概述-------------------------
 *
 *    过滤器可以把对资源的请求拦截下来，从而实现一些特殊的功能
 *
 *    过滤器一般完成一些通用的操作
 *
 *    Filter的实现步骤：
 *      定义类，实现 Filter接口，并重写其所有方法
 *      配置Filter拦截资源的路径：在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源
 *      在doFilter方法中输出一句话，并放行
 *
 *    Filter执行流程
 *          执行放行前的逻辑  ->   放行  ->   访问资源  ->  执行放行后的逻辑
 *
 *          放行前，对Request数据进行处理               放行后，对Response数据进行处理
 *
 *   ------------------------Filter拦截路径配置-------------------------
 *
 *      拦截具体的资源：/index.jsp：只有访问index.jsp时才会被拦截
 *      目录拦截：/user/*：访问/user下的所有资源，都会被拦截
 *      后缀名拦截：*.jsp：访问后缀名为jsp的资源，都会被拦截
 *      拦截所有：/*：访问所有资源，都会被拦截
 *
 *   ------------------------Filter过滤器链-------------------------
 *
 *   过滤器链是指在一个Web应用，可以配置多个过滤器，这多个过滤器称为过滤器链
 *
 *    执行 Filter1 的放行前逻辑代码
 *    执行 Filter1 的放行代码
 *    执行 Filter2 的放行前逻辑代码
 *    执行 Filter2 的放行代码
 *    访问到资源
 *    执行 Filter2 的放行后逻辑代码
 *    执行 Filter1 的放行后逻辑代码
 *    以上流程串起来就像一条链子，故称之为过滤器链。
 *
 *    我们现在使用的是注解配置Filter，而这种配置方式的优先级是按照过滤器类名(字符串)的自然排序。
 *    比如有如下两个名称的过滤器 ： BFilterDemo 和 AFilterDemo 。那一定是 AFilterDemo 过滤器先执行。
 *
 */
//@WebFilter("/*")
public class Filter1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                            FilterChain filterChain) throws IOException, ServletException {

        System.out.println("Filter------------11111111");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Filter------------22222222");
    }

    @Override
    public void destroy() {
    }
}
